/**
 * 
 */
package com.udc.medLine.utils;

import java.io.IOException;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.udc.medLine.entity.Cliente;
import com.udc.medLine.entity.CondicaoVO;
import com.udc.medLine.entity.Funcionario;
import com.udc.medLine.entity.Pessoa;
import com.udc.medLine.exception.BaseException;
import com.udc.medLine.transaction.TransactionCliente;
import com.udc.medLine.transaction.TransactionFuncionario;

/**
 * @author Odair Kreuzberg
 * 
 */
public final class SecurityUtils {

	/**
	 * Autentica o usuario e o inclui na sessao para uso posterior na aplicacao
	 * 
	 * @param request
	 * @param session
	 * @throws Exception 
	 */
	public static void authenticateFuncionario(HttpServletRequest request,
			HttpSession session) throws Exception {

		String username = request.getParameter("username");
		String password = request.getParameter("password");

		TransactionFuncionario transaction = new TransactionFuncionario();

		CondicaoVO condicao = new CondicaoVO();


		condicao.setCampo("usuario");

		condicao.setOperador("igual");
		condicao.setValor(username);

		List<?> result = transaction.search(condicao);

		if (result.size() == 1) {

			Funcionario funcionario = (Funcionario) result.get(0);

			if (funcionario.getSenha().equals(password)) {

				session.setAttribute("usuario", funcionario);
			}else{
				
				throw new BaseException();				
			}		
		}else{
			throw new BaseException();	
		}
	}

	/**
	 * Autentica o usuario e o inclui na sessao para uso posterior na aplicacao
	 * 
	 * @param request
	 * @param session
	 * @throws BaseException 
	 */
	

	public static void authenticateCliente(HttpServletRequest request,
			HttpSession session) throws Exception {

		String username = request.getParameter("username");
		String password = request.getParameter("password");

		TransactionCliente transaction = new TransactionCliente();

		CondicaoVO condicao = new CondicaoVO();

		condicao.setCampo("usuario");
		condicao.setOperador("igual");
		condicao.setValor(username);

		List<?> result = transaction.search(condicao);

		if (result.size() == 1) {

			Cliente cliente = (Cliente) result.get(0);

			if (cliente.getSenha().equals(password)) {

				session.setAttribute("usuario", cliente);
			}else{
				
				throw new BaseException();				
			}		
		}else{
			throw new BaseException();	
		}
	}
	
	public static void AtualizaUsuario1(HttpSession session) throws Exception {
   //     Cliente teste = new Cliente	();
   //     teste = (Cliente)getAuthenticatedUser(session);
		String username = getAuthenticatedUser(session).getUsuario();
		String password = getAuthenticatedUser(session).getSenha();


		TransactionCliente transaction = new TransactionCliente();

		CondicaoVO condicao = new CondicaoVO();

		condicao.setCampo("usuario");
		condicao.setOperador("igual");
		condicao.setValor(username);

		List<?> result = transaction.search(condicao);

		if (result.size() == 1) {

			Cliente cliente = (Cliente) result.get(0);

			if (cliente.getSenha().equals(password)) {

				session.setAttribute("usuario", cliente);
			}
		}
	}
	
	public static void AtualizaUsuario(HttpSession session,HttpServletResponse response) throws Exception {

		        List<?> result = null;
		        String username = getAuthenticatedUser(session).getUsuario();
				String password = getAuthenticatedUser(session).getSenha();
                String perfil  = getAuthenticatedUser(session).getPerfil().getNome();
				CondicaoVO condicao = new CondicaoVO();
				condicao.setCampo("usuario");
				condicao.setOperador("igual");
				condicao.setValor(username);
				if (perfil.equals("admin")){
					 TransactionFuncionario transaction = new TransactionFuncionario();	
					 result = transaction.search(condicao);
					 if (result.size() == 0) {
						 response.sendRedirect("/med-line/page/admin/?method=sairUsuario");
					 }else{
					        Funcionario funcionario = (Funcionario) result.get(0);
					        if (funcionario.getSenha().equals(password)) {
					        	session.removeAttribute("admin");
					        	session.setAttribute("usuario", funcionario);
							}
					 }
				} else if (perfil.equals("cliente")){
					 TransactionCliente transaction = new TransactionCliente();	
					 result = transaction.search(condicao);
					 if (result.size() == 1) {
							Cliente cliente = (Cliente) result.get(0);
							if (cliente.getSenha().equals(password)) {
								session.removeAttribute("usuario");
								session.setAttribute("usuario", cliente);
							}
					 }
				}
			}

	/**
	 * Valida a sessao do funcionario, redirecionando o usuario para a tela de
	 * autenticacao se nao autenticado ainda ou para uma pagina de erro no caso
	 * do usuario logado nao ser um funcionario.
	 * 
	 * @param session
	 * @param response
	 * 
	 * @return true se a sessao esta valida, caso contrario, false
	 * 
	 * @throws IOException
	 */
	public static boolean validaSessaoFuncionario(HttpSession session,
			HttpServletResponse response) throws IOException {

		if (!SecurityUtils.isAuthenticated(session)) {

			response.sendRedirect("/med-line/page/admin/index.jsp");
			
			return false;

		} else if (!SecurityUtils.isFuncionarioAuthenticated(session)) {

			response.sendRedirect("/med-line/page/admin/acessoNegado.jsp");
			
			return false;
		}
		
		return true;
	}


	/**
	 * Valida a sessao do funcionario, redirecionando o usuario para a tela de
	 * autenticacao se nao autenticado ainda ou para uma pagina de erro no caso
	 * do usuario logado nao ser um funcionario.
	 * 
	 * @param session
	 * @param response
	 * @throws IOException
	 */
	public static void validaSessaoCliente(HttpSession session,
			HttpServletResponse response) throws IOException {

		if (!SecurityUtils.isAuthenticated(session)) {

			response.sendRedirect("/med-line");

		} else if (!SecurityUtils.isClienteAuthenticated(session)) {

			response.sendRedirect("/med-line/page/admin/acessoNegado.jsp");
			
		}
		
	}
	
	
	public static String ValidaSessaoUsuario(HttpSession session,
			HttpServletResponse response) throws Exception {
		String tipoUser = new String("user");
		
		if (SecurityUtils.isAuthenticated(session)) {
			
			if (isCliente((Pessoa)getAuthenticatedUser(session))==true){
			   tipoUser =  "cliente";
			   AtualizaUsuario(session,response);
		   
		   } else {
			   tipoUser =  "usuario";
		   }
		 
     	} else if (!SecurityUtils.isFuncionarioAuthenticated(session)) {
			response.sendRedirect("/med-line/page/admin/acessoNegado.jsp");
		}
	 return tipoUser; 
	}
	
	
	
	public static Pessoa getAuthenticatedUser(HttpSession session) {
         return (Pessoa) session.getAttribute("usuario");
	}

	public static boolean isAuthenticated(HttpSession session) {

		return SecurityUtils.getAuthenticatedUser(session) != null;
	}

	public static boolean isFuncionarioAuthenticated(HttpSession session) {

		if (isAuthenticated(session)) {

			Pessoa usuario = getAuthenticatedUser(session);

			return SecurityUtils.isFuncionario(usuario);
		}

		return false;
	}

	public static boolean isClienteAuthenticated(HttpSession session) {

		if (isAuthenticated(session)) {

			Pessoa usuario = getAuthenticatedUser(session);

			return SecurityUtils.isCliente(usuario);
		}

		return false;
	}

	public static boolean isCliente(Pessoa pessoa) {

		return pessoa.getPerfil().getNome().equals("cliente");
		

	}

	public static boolean isFuncionario(Pessoa pessoa) {

		return pessoa.getPerfil().getNome().equals("admin");

	}

}
